// 导入 mysql 包
const mysql = require("mysql");

// 将回调函数封装为 Promise 方式
class MySql {
  // 构造函数
  constructor(config) {
    // 产生数据库连接池对象： pool
    this.pool = mysql.createPool(config);
  }
  /**
   * query 执行 SQL 语句
   *
   * @param {string} sql 语句
   * @param {array} values 参数数组
   * @returns Promise<Array>
   */
  async query(sql, values) {
    return new Promise((resolve, reject) => {
      this.pool.query(sql, values, (error, results, fields) => {
        if (error) return reject(error);
        resolve([results, fields]);
      });
    });
  }
  async select(sql, values) {
    const [results] = await this.query(sql, values);
    return results;
  }
  /**
   * findOne
   * 只返回一条记录，适合执行聚合的语句。
   *
   * @param {string} sql select 语句
   * @param {Array} values 参数数组
   * @returns Promise<any>
   */
  async findOne(sql, values) {
    const [[one]] = await this.query(sql, values);
    return one;
  }
  /**
   * close 关闭连接池对象
   *
   * @returns void
   */
  async close() {
    return new Promise((resolve, reject) => {
      this.pool.end((err) => {
        if (err) return reject(err);
        resolve();
      });
    });
  }
}
const { host = "localhost", user = "root", password, database } = process.env;

const db = new MySql({
  host,
  user,
  password,
  database,
  connectionLimit: 10,
});

module.exports = { db };
